#include <stdio.h>
#include <string.h>

int sum(int* start, int* end) {
  int total = 0;
  while (start < end) {
    total += *start;
    start++;
  }
  return total;
}
// 原型的省略写法
int sum_array3(int, int [*]);
int sum_array3(int, int []);
// 多维数组的原型
int sum_array4(int n, int m, int a[n][m]);

// 第一个参数是数组的地址
int sum_array1(int a[], int n) {
  //
  return 0;
}
// 如果是二维数组，后面就要带上长度，这样编译器才能算出长度
int sum_array2(int a[][4], int n) {
  //
  return 0;
}
// 如果是可变数组，长度必须要在前面
int sum_array3(int n, int a[n]) {
  //
  return 0;
}


int main(void) {
  
  // 长度为100
  int scores[100];
  scores[0] = 13;
  scores[1] = 42;

  int a[5] = {22, 33, 3490};
  // 等同于
  // int a[5] = {22, 37, 3490, 0, 0};
  // a = {100}; 报错 
  // 数组变量一旦声明就不得修改变量地址
  // 指定位置赋值
  int a1[15] = {[9]=7, [14]=48, [2]=29};
  // sizeof 的数据类型 size_t
  int length = sizeof(a1);
  printf("%zu\n", sizeof(a1));
  printf("%zu\n", sizeof(int));
  printf("%zu\n", sizeof(a1)/sizeof(int));
  // 多维数组
  int board[10][10];
  board[0][0] = 13;
  int a2[2][5] = {
    {0,1,2,3,4},
    {5,6,7,8,9}
  };
  int x,y = 1;
  int n = x + y;
  // 变长数组
  int arr[n];
 
  // 数组的地址
  int arr1[5] = {11, 22, 33, 44, 55};
  int *p;
  p = &arr1[0];
  printf("%d\n", *p);
  // 数组的加减法
  int arr2[5] = {11, 22, 33, 44, 55};
  for (int i = 0; i < 5; i++) {
    printf("%d\n", *(arr2 + i));
  }
  // a[b] = *(a+b) 
  int arr3[] = {11, 22, 33, 44, 55, 999};
  int* p1 = arr3;
  while(*p1 != 999) {
    printf("%d\n", *p1);
    // p1++指向下个成员
    p1++;
  }
  int arr4[5] = {11, 22, 33, 44, 55};
  // arr4指地址
  printf("%p\n", arr4);
  printf("%i\n", sum(arr4, arr4 + 5));
  int* p2 = arr4;
  while (*p2 != 55) {
    p2++;
  }
  // 获取数组的长度
  printf("%li\n", p2-arr4);
  // 多维数组的指针加减法
  int arr5[4][2];
  // 指向arr5[1]
  arr5 + 1;
  // 指向arr5[0][1]
  arr5[0] + 1;
  int arr51[] = {1,2,3,4,5};
  int* p3 = &arr51[5];
  int* q1 = &arr51[1];
  // 返回距离
  printf("%li\n", p3 - q1); // 4
  printf("%li\n", q1 - p3); // -4
  // 数组的复制
  int* arr6;
  int b1[3] = {1,2,3};
  // 没有深拷贝，只是指向的改变
  arr6 = b1;
  // 最简单的复制
  for (int i = 0; i < 3; i++) {
    arr6[i] = b1[i];
  }
  // 直接复制内存
  memcpy(arr6, b1, sizeof(b1));

  // 数组字面量作为参数
  int sum = sum_array1((int []){2, 3, 4, 5}, 4);

  return 0;
}